﻿/*
Libnodave的一部分，它是通过Siemens S7 200 / 300 / 400的免费通讯库
MPI适配器6ES7 972 - 0CA22 - 0XAC
或MPI适配器6ES7 972 - 0CA23 - 0XAC
或TS适配器6ES7 972 - 0CA33 - 0XAC
或MPI适配器6ES7 972 - 0CA11 - 0XAC，
IBH / MHJ - NetLink或CP 243、343和443
或具有内置以太网支持的VIPA Speed7。

（C）托马斯·赫根汉（Thomas Hergenhahn）（thomas.hergenhahn@web.de）2002..2005

Libnodave是免费软件；您可以重新分发和 / 或修改
根据GNU图书馆通用公共许可协议发布的条款
自由软件基金会；版本2或（由您选择）
任何更高版本。

分发Libnodave希望它会有用，
但没有任何保证；甚至没有默示担保
特定目的的适销性或适用性。见
有关更多详细信息，请参见GNU通用公共许可证。

您应该已经收到了GNU库通用公共许可证的副本
与Libnodave一起；请参阅文件COPYING。如果没有，写信给
自由软件基金会（Free Software Foundation），地址为675 Mass Ave，剑桥，MA 02139，美国。
* /
/ *
不要在C程序中使用此包含文件。只在这里想要的人
将Libnodave与其他编程语言接口，因此他们看到了
不一定需要实现所有内部结构。

因此，如果您打算与其他语言进行交互，则此文件将向您显示
显示您需要使编译器知道的最少结构和功能。
*/

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __nodave
#define __nodave

#ifdef LINUX
#define DECL2
#define EXPORTSPEC
typedef struct {
    int rfd;
    int wfd;
//    int conType; //记住这是套接字还是串行连接还是句柄还是其他
} _daveOSserialType;
#include <stdlib.h>
#else    
#ifdef BCCWIN
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define DECL2 __stdcall
//#define DECL2 cdecl
#ifdef DOEXPORT
#define EXPORTSPEC __declspec (dllexport)
#else
#define EXPORTSPEC __declspec (dllimport)
#endif
typedef struct {
    HANDLE rfd;
    HANDLE wfd;
//    int conType;
} _daveOSserialType;
#else
#error Fill in what you need for your OS or API.
#endif /* BCCWIN */
#endif /* LINUX */

/*
    Protocol types to be used with newInterface:
*/
#define daveProtoMPI	0	/* MPI for S7 300/400 */
#define daveProtoMPI2	1	/* MPI for S7 300/400, "Andrew's version" */
#define daveProtoMPI3	2	/* MPI for S7 300/400, Step 7 Version, not well tested */
#define daveProtoMPI4	3	/* MPI for S7 300/400, "Andrew's version" with extra STX */
#define daveProtoPPI	10	/* PPI for S7 200 */

#define daveProtoAS511	20	/* S5 编程端口协议 */

#define daveProtoS7online 50	/* 使用s7onlinx.dll进行传输 */

#define daveProtoISOTCP	122	/* 通过TCP的ISO */
#define daveProtoISOTCP243 123	/* 使用CP243的TCP上的ISO */

#define daveProtoNLpro 230	/* 带NetLink Pro MPI的MPI到以太网网关 */

#define daveProtoMPI_IBH 223	/* 具有IBH NetLink MPI的MPI到以太网网关 */
#define daveProtoPPI_IBH 224	/* 带有IBH NetLink PPI到以太网网关的PPI */

#define daveProtoUserTransport 255	/* Libnodave将把S7通信的PDU传递给用户*/
					/* 定义的回调函数。*/

/*
 *   ProfiBus速度常数：
*/
#define daveSpeed9k     0
#define daveSpeed19k    1
#define daveSpeed187k   2
#define daveSpeed500k   3
#define daveSpeed1500k  4
#define daveSpeed45k    5
#define daveSpeed93k    6

/*
    一些MPI功能代码（但尚未使用的可能不正确）。
*/
#define daveFuncOpenS7Connection	0xF0
#define daveFuncRead			0x04
#define daveFuncWrite			0x05
#define daveFuncRequestDownload		0x1A
#define daveFuncDownloadBlock		0x1B
#define daveFuncDownloadEnded		0x1C
#define daveFuncStartUpload		0x1D
#define daveFuncUpload			0x1E
#define daveFuncEndUpload		0x1F
#define daveFuncInsertBlock		0x28
/*
    S7特定常数：
*/
#define daveBlockType_OB  '8'
#define daveBlockType_DB  'A'
#define daveBlockType_SDB 'B'
#define daveBlockType_FC  'C'
#define daveBlockType_SFC 'D'
#define daveBlockType_FB  'E'
#define daveBlockType_SFB 'F'
/*
    在daveReadBytes和daveWriteBytes中将这些常量用于参数“ area”
*/    
#define daveSysInfo 0x3		/* System info of 200 family */
#define daveSysFlags  0x5	/* System flags of 200 family */
#define daveAnaIn  0x6		/* analog inputs of 200 family */
#define daveAnaOut  0x7		/* analog outputs of 200 family */

#define daveP 0x80    
#define daveInputs 0x81    
#define daveOutputs 0x82    
#define daveFlags 0x83
#define daveDB 0x84	/* data blocks */
#define daveDI 0x85	/* instance data blocks */
#define daveLocal 0x86 	/* not tested */
#define daveV 0x87	/* don't know what it is */
#define daveCounter 28	/* S7 counters */
#define daveTimer 29	/* S7 timers */
#define daveCounter200 30	/* IEC counters (200 family) */
#define daveTimer200 31		/* IEC timers (200 family) */

/**
    Library specific:
**/
/*
结果代码。 通常，0表示可以，
     > 0是PLC报告的结果（也是错误）
	      <0表示库代码报告错误。
*/
#define daveResOK 0				/* means all ok */
#define daveResNoPeripheralAtAddress 1		/* CPU tells there is no peripheral at address */
#define daveResMultipleBitsNotSupported 6 	/* CPU tells it does not support to read a bit block with a */
						/* length other than 1 bit. */
#define daveResItemNotAvailable200 3		/* means a a piece of data is not available in the CPU, e.g. */
						/* when trying to read a non existing DB or bit bloc of length<>1 */
						/* This code seems to be specific to 200 family. */
					    
#define daveResItemNotAvailable 10		/* means a a piece of data is not available in the CPU, e.g. */
						/* when trying to read a non existing DB */

#define daveAddressOutOfRange 5			/* means the data address is beyond the CPUs address range */
#define daveWriteDataSizeMismatch 7		/* means the write data size doesn't fit item size */
#define daveResCannotEvaluatePDU -123    
#define daveResCPUNoData -124 
#define daveUnknownError -125 
#define daveEmptyResultError -126 
#define daveEmptyResultSetError -127 
#define daveResUnexpectedFunc -128 
#define daveResUnknownDataUnitSize -129

#define daveResShortPacket -1024 
#define daveResTimeout -1025 

/*
错误代码到消息字符串的转换：
     调用此函数可获取其他函数返回的错误代码的解释。
*/
EXPORTSPEC char * DECL2 daveStrerror(int code);
/*
将内部字符串复制到外部字符串缓冲区。 这是接口所需的
     使用Visual Basic。 也许在其他地方也有帮助。
*/
EXPORTSPEC void DECL2 daveStringCopy(char * intString, char * extString);

/* 
    单个消息中的最大字节数。
*/
#define daveMaxRawLen 2048
/*
    调试的一些定义：
*/
#define daveDebugRawRead  	0x01	/* Show the single bytes received */
#define daveDebugSpecialChars  	0x02	/* Show when special chars are read */
#define daveDebugRawWrite	0x04	/* Show the single bytes written */
#define daveDebugListReachables 0x08	/* Show the steps when determine devices in MPI net */
#define daveDebugInitAdapter 	0x10	/* Show the steps when Initilizing the MPI adapter */
#define daveDebugConnect 	0x20	/* Show the steps when connecting a PLC */
#define daveDebugPacket 	0x40
#define daveDebugByte 		0x80
#define daveDebugCompare 	0x100
#define daveDebugExchange 	0x200
#define daveDebugPDU 		0x400	/* debug PDU handling */
#define daveDebugUpload		0x800	/* debug PDU loading program blocks from PLC */
#define daveDebugMPI 		0x1000
#define daveDebugPrintErrors	0x2000	/* Print error messages */
#define daveDebugPassive 	0x4000
#define daveDebugErrorReporting	0x8000
#define daveDebugOpen		0x10000  /* print messages in openSocket and setPort */

#define daveDebugAll 0x1ffff
/*
   设置和读取调试级别：
*/
EXPORTSPEC void DECL2 daveSetDebug(int nDebug);
EXPORTSPEC int DECL2 daveGetDebug(void);
/*
    Some data types:
*/
#define uc unsigned char
#define us unsigned short
#define u32 unsigned int

/* 
    这是串行或以太网接口的包装。 这是为了使移植更容易。
*/

typedef struct _daveConnection  daveConnection;
typedef struct _daveInterface  daveInterface;

/*
帮助程序结构来管理PDU。 这不是我称为PDU的数据包的一部分，但是
     一组指针，可简化对PDU“专用部分”的访问。
*/
/* 虽然gcc-3.3可以处理大小为0的结构（至少是指向它的指针），但BCC不能。*/
/*
typedef struct {
} PDU;
*/
typedef struct {
    uc * header;	/* pointer to start of PDU (PDU header) */
    uc * param;		/* pointer to start of parameters inside PDU */
    uc * data;		/* pointer to start of data inside PDU */
    uc * udata;		/* pointer to start of data inside PDU */
    int hlen;		/* header length */
    int plen;		/* parameter length */
    int dlen;		/* data length */
    int udlen;		/* user or result data length */
} PDU;



/* 
这会将接口与有关其属性的一些信息一起分组
     在图书馆的背景下。
*/
struct _daveInterface {
    int _timeout;	/* Timeout in microseconds used in transort. */
};

EXPORTSPEC daveInterface * DECL2 daveNewInterface(_daveOSserialType nfd, char * nname, int localMPI, int protocol, int speed);

/* 
    This holds data for a PLC connection;
*/
struct _daveConnection {
    int AnswLen;	/* length of last message */
    uc * resultPointer;	/* used to retrieve single values from the result byte array */
    int maxPDUlength;
//    int MPIAdr;		/* The PLC's address */
}; 

/* 
    Setup a new connection structure using an initialized
    daveInterface and PLC's MPI address.
*/
EXPORTSPEC daveConnection * DECL2 daveNewConnection(daveInterface * di, int MPI,int rack, int slot);

typedef struct {
    uc type[2];
    unsigned short count;
} daveBlockTypeEntry;

typedef struct {
    unsigned short number;
    uc type[2];
} daveBlockEntry;
/**
PDU处理：
     PDU是S7通信中存在的中心结构。
	 它由一个10或12字节的标题，一个参数块和一个数据块组成。
	读取或写入值时，数据字段本身由数据组成
	标头，后跟有效载荷数据
**/
/*
    retrieve the answer
*/
EXPORTSPEC int DECL2 daveGetResponse(daveConnection * dc);
/*
    send PDU to PLC
*/
EXPORTSPEC int DECL2 daveSendMessage(daveConnection * dc, PDU * p);

/******
    
    Utilities:
    
****/
/*
    Hex dump PDU:
*/
EXPORTSPEC void DECL2 _daveDumpPDU(PDU * p);

/*
    Hex dump. Write the name followed by len bytes written in hex and a newline:
*/
EXPORTSPEC void DECL2 _daveDump(char * name,uc*b,int len);

/*
    names for PLC objects:
*/
EXPORTSPEC char * DECL2 daveBlockName(uc bn);
EXPORTSPEC char * DECL2 daveAreaName(uc n);

/*
    swap functions:
*/
EXPORTSPEC short DECL2 daveSwapIed_16(short ff);
EXPORTSPEC int DECL2 daveSwapIed_32(int ff);

/**
数据转换便利功能。 旧集已被删除。
     较新的转换例程。 由于单词WORD，INT，INTEGER等具有不同的含义
	      对于不同编程语言和编译器的用户，我选择提供一个新的
		       根据所使用值的位长命名的一组转换例程。 'U'
			        或“ S”代表未签名或已签名。
**/
/*
    Get a value from the position b points to. B is typically a pointer to a buffer that has
    been filled with daveReadBytes:
*/
EXPORTSPEC float DECL2 daveGetFloatAt(daveConnection * dc, int pos);


EXPORTSPEC float DECL2 toPLCfloat(float ff);
EXPORTSPEC int DECL2 daveToPLCfloat(float ff);



EXPORTSPEC int DECL2 daveGetS8from(uc *b);
EXPORTSPEC int DECL2 daveGetU8from(uc *b);
EXPORTSPEC int DECL2 daveGetS16from(uc *b);
EXPORTSPEC int DECL2 daveGetU16from(uc *b);
EXPORTSPEC int DECL2 daveGetS32from(uc *b);
EXPORTSPEC unsigned int DECL2 daveGetU32from(uc *b);
EXPORTSPEC float DECL2 daveGetFloatfrom(uc *b);
/*
从连接dc上读取的最后结果中的当前位置获取一个值。
     这将增加一个内部指针，因此从该位置读取下一个值
	      遵循此值。
*/

EXPORTSPEC int DECL2 daveGetS8(daveConnection * dc);
EXPORTSPEC int DECL2 daveGetU8(daveConnection * dc);
EXPORTSPEC int DECL2 daveGetS16(daveConnection * dc);
EXPORTSPEC int DECL2 daveGetU16(daveConnection * dc);
EXPORTSPEC int DECL2 daveGetS32(daveConnection * dc);
EXPORTSPEC unsigned int DECL2 daveGetU32(daveConnection * dc);
EXPORTSPEC float DECL2 daveGetFloat(daveConnection * dc);
/*
    从连接dc上读取的最后结果中的给定位置获取值。
*/
EXPORTSPEC int DECL2 daveGetS8At(daveConnection * dc, int pos);
EXPORTSPEC int DECL2 daveGetU8At(daveConnection * dc, int pos);
EXPORTSPEC int DECL2 daveGetS16At(daveConnection * dc, int pos);
EXPORTSPEC int DECL2 daveGetU16At(daveConnection * dc, int pos);
EXPORTSPEC int DECL2 daveGetS32At(daveConnection * dc, int pos);
EXPORTSPEC unsigned int DECL2 daveGetU32At(daveConnection * dc, int pos);
/*
    将一个字节放入缓冲区b：
*/
EXPORTSPEC uc * DECL2 davePut8(uc *b,int v);
EXPORTSPEC uc * DECL2 davePut16(uc *b,int v);
EXPORTSPEC uc * DECL2 davePut32(uc *b,int v);
EXPORTSPEC uc * DECL2 davePutFloat(uc *b,float v);

EXPORTSPEC void DECL2 davePut8At(uc *b, int pos, int v);
EXPORTSPEC void DECL2 davePut16At(uc *b, int pos, int v);
EXPORTSPEC void DECL2 davePut32At(uc *b, int pos, int v);
EXPORTSPEC void DECL2 davePutFloatAt(uc *b,int pos, float v);
/**
    计时器和计数器转换功能：
**/
/*	
    从当前读取位置获取时间（以秒为单位）：
*/
EXPORTSPEC float DECL2 daveGetSeconds(daveConnection * dc);
/*	
   从随机位置获取时间（以秒为单位）：
*/
EXPORTSPEC float DECL2 daveGetSecondsAt(daveConnection * dc, int pos);
/*	
    从当前读取位置获取计数器值：
*/
EXPORTSPEC int DECL2 daveGetCounterValue(daveConnection * dc);
/*	
   从随机读取位置获取计数器值：
*/
EXPORTSPEC int DECL2 daveGetCounterValueAt(daveConnection * dc,int pos);

/*
    从PLC加载块的功能：
*/
EXPORTSPEC void DECL2 _daveConstructUpload(PDU *p,char blockType, int blockNr);

EXPORTSPEC void DECL2 _daveConstructDoUpload(PDU * p, int uploadID);

EXPORTSPEC void DECL2 _daveConstructEndUpload(PDU * p, int uploadID);
/*
获取PLC的订购代码为ASCIIZ。 Buf必须为
     至少21个字符。
*/

#define daveOrderCodeSize 21
EXPORTSPEC int DECL2 daveGetOrderCode(daveConnection * dc,char * buf);
/*
    connect to a PLC. returns 0 on success.
*/

EXPORTSPEC int DECL2 daveConnectPLC(daveConnection * dc);

/* 

767/5000
从PLC读取len个字节。 开始确定第一个字节。
区域表示数据是否来自标志，数据块，
输入或输出等
DB是要使用的数据块的编号。 设置为零
对于其他区域类型。
缓冲区是指向调用提供的存储块的指针
程序。 如果指针不为NULL，则将结果数据复制到该指针。
因此，它必须足够大才能容纳结果。
无论如何，您也可以使用get <type>宏检索结果数据
在连接指针上。

限制：没有检查最大值。 消息len或自动拆分为
多条消息。 如果需要的数据，请使用daveReadManyBytes（）
读取不适合单个PDU。
		
*/
EXPORTSPEC int DECL2 daveReadBytes(daveConnection * dc, int area, int DB, int start, int len, void * buffer);

/* 
从PLC读取len个字节。 开始确定第一个字节。
    与daveReadBytes（）相比，此函数可以读取块
	 对于单笔交易来说太长了。 为了达成这个，
	 通过多个后续读取请求来获取数据
	 CPU。
	区域表示数据是否来自标志，数据块，
	输入或输出等
	 DB是要使用的数据块的编号。 设置为零
	对于其他区域类型。
	 缓冲区是指向调用提供的存储块的指针
	程序。 它可能不为NULL，结果数据将被复制到其中。
	因此，它必须足够大才能容纳结果。
	您无法从内部缓冲区读取结果字节
	daveConnection。 在每个读取请求中，此缓冲区都将被覆盖。
*/
EXPORTSPEC int DECL2 daveReadManyBytes(daveConnection * dc,int area, int DBnum, int start,int len, void * buffer);

/* 
将缓冲区中的len个字节写入PLC。
开始确定第一个字节。
区域表示数据是否到达FLAGS，DATA BLOCKS，
输入或输出等
DB是要使用的数据块的编号。 设置为零
对于其他区域类型。
限制：没有检查最大。 消息len或自动拆分为
多条消息。 如果需要的数据，请使用daveReadManyBytes（）
读取不适合单个PDU。

*/
EXPORTSPEC int DECL2 daveWriteBytes(daveConnection * dc,int area, int DB, int start, int len, void * buffer);

/* 
将len个字节写入PLC。 开始确定第一个字节。
与daveWriteBytes（）相比，此函数可以写入块
对于单笔交易来说太长了。 为此，
数据与多个后续写入请求一起传输到
CPU。
 区域表示数据是否来自标志，数据块，
输入或输出等
DB是要使用的数据块的编号。 设置为零
对于其他区域类型。
 缓冲区是指向调用提供的存储块的指针
 程序。 它不能为NULL。
*/
EXPORTSPEC int DECL2 daveWriteManyBytes(daveConnection * dc,int area, int DB, int start, int len, void * buffer);

/* 
    位操作：
*/
EXPORTSPEC int DECL2 daveReadBits(daveConnection * dc, int area, int DB, int start, int len, void * buffer);
EXPORTSPEC int DECL2 daveWriteBits(daveConnection * dc,int area, int DB, int start, int len, void * buffer);
EXPORTSPEC int DECL2 daveSetBit(daveConnection * dc,int area, int DB, int byteAdr, int bitAdr);
EXPORTSPEC int DECL2 daveClrBit(daveConnection * dc,int area, int DB, int byteAdr, int bitAdr);

/*
    PLC诊断和库存功能：
*/
EXPORTSPEC int DECL2 daveReadSZL(daveConnection * dc, int ID, int index, void * buf, int buflen);
EXPORTSPEC int DECL2 daveListBlocksOfType(daveConnection * dc,uc type,daveBlockEntry * buf);
EXPORTSPEC int DECL2 daveListBlocks(daveConnection * dc,daveBlockTypeEntry * buf);
/*
    PLC程序读取功能：
*/
EXPORTSPEC int DECL2 initUpload(daveConnection * dc,char blockType, int blockNr, int * uploadID);
EXPORTSPEC int DECL2 doUpload(daveConnection*dc, int * more, uc**buffer, int*len, int uploadID);
EXPORTSPEC int DECL2 endUpload(daveConnection*dc, int uploadID);
EXPORTSPEC int DECL2 daveGetProgramBlock(daveConnection * dc, int blockType, int number, char* buffer, int * length);
/*
    PLC运行/停止控制功能：
*/
EXPORTSPEC int DECL2 daveStop(daveConnection*dc);
EXPORTSPEC int DECL2 daveStart(daveConnection*dc);
/*
    PLC特殊命令
*/    
EXPORTSPEC int DECL2 daveCopyRAMtoROM(daveConnection*dc);
	
EXPORTSPEC int DECL2 daveForce200(daveConnection * dc, int area, int start, int val);
/*
    多变量支持：
*/
typedef struct {
    int error;
    int length;
    uc * bytes;
} daveResult;

typedef struct {
    int numResults;
    daveResult * results;
} daveResultSet;


/* 使用它来初始化多变量读取： */
EXPORTSPEC void DECL2 davePrepareReadRequest(daveConnection * dc, PDU *p);
/* 向准备好的请求中添加新变量： */
EXPORTSPEC void DECL2 daveAddVarToReadRequest(PDU *p, int area, int DBnum, int start, int bytes);
/* 执行完整的请求。 */
EXPORTSPEC int DECL2 daveExecReadRequest(daveConnection * dc, PDU *p, daveResultSet * rl);
/* 使函数daveGet <data type>处理第n个结果： */
EXPORTSPEC int DECL2 daveUseResult(daveConnection * dc, daveResultSet * rl, int n);
/* Frees结果结构占用的内存 */
EXPORTSPEC void DECL2 daveFreeResults(daveResultSet * rl);
/* 向准备好的请求中添加新的位变量： */
EXPORTSPEC void DECL2 daveAddBitVarToReadRequest(PDU *p, int area, int DBnum, int start, int byteCount);

/* 使用它来初始化多变量写入：*/
EXPORTSPEC void DECL2 davePrepareWriteRequest(daveConnection * dc, PDU *p);
/* 向准备好的请求中添加新变量： */
EXPORTSPEC void DECL2 daveAddVarToWriteRequest(PDU *p, int area, int DBnum, int start, int bytes, void * buffer);
/* 在准备好的写请求中添加一个新的位变量：*/
EXPORTSPEC void DECL2 daveAddBitVarToWriteRequest(PDU *p, int area, int DBnum, int start, int byteCount, void * buffer);
/* 执行完整的请求。 */
EXPORTSPEC int DECL2 daveExecWriteRequest(daveConnection * dc, PDU *p, daveResultSet * rl);


EXPORTSPEC int DECL2 daveInitAdapter(daveInterface * di);
EXPORTSPEC int DECL2 daveConnectPLC(daveConnection * dc);
EXPORTSPEC int DECL2 daveDisconnectPLC(daveConnection * dc);

EXPORTSPEC int DECL2 daveDisconnectAdapter(daveInterface * di);
EXPORTSPEC int DECL2 daveListReachablePartners(daveInterface * di,char * buf);

/* MPI特定功能 */

#define daveMPIReachable 0x30
#define daveMPIActive 0x30
#define daveMPIPassive 0x00
#define daveMPIunused 0x10
#define davePartnerListSize 126
/**
    C＃互操作性：
**/
EXPORTSPEC void DECL2 daveSetTimeout(daveInterface * di, int tmo);
EXPORTSPEC int DECL2 daveGetTimeout(daveInterface * di);

EXPORTSPEC char * DECL2 daveGetName(daveInterface * di);

EXPORTSPEC int DECL2 daveGetMPIAdr(daveConnection * dc);
EXPORTSPEC int DECL2 daveGetAnswLen(daveConnection * dc);
EXPORTSPEC int DECL2 daveGetMaxPDULen(daveConnection * dc);
EXPORTSPEC daveResultSet * DECL2 daveNewResultSet();
EXPORTSPEC void DECL2 daveFree(void * dc);
EXPORTSPEC PDU * DECL2 daveNewPDU();
EXPORTSPEC int DECL2 daveGetErrorOfResult(daveResultSet *,int number);

/*
    特殊功能可断开IBH-Link上的任意连接：
*/
EXPORTSPEC int DECL2 daveForceDisconnectIBH(daveInterface * di, int src, int dest, int mpi);
/*
特殊功能会重置IBH-Link：
*/
EXPORTSPEC int DECL2 daveResetIBH(daveInterface * di);
/**
    PLC的程序块：
*/
EXPORTSPEC int DECL2 daveGetProgramBlock(daveConnection * dc, int blockType, int number, char* buffer, int * length);
/**
    PLC实时时钟处理：
*/ 
/*
    读出时钟：
*/ 
EXPORTSPEC int DECL2 daveReadPLCTime(daveConnection * dc);
/*
    将时钟设置为用户给定的值：
*/ 
EXPORTSPEC int DECL2 daveSetPLCTime(daveConnection * dc,uc * ts);
/*
   将时钟设置为PC系统时钟：
*/ 
EXPORTSPEC int DECL2 daveSetPLCTimeToSystime(daveConnection * dc);

EXPORTSPEC uc DECL2 daveToBCD(uc i);
EXPORTSPEC uc DECL2 daveFromBCD(uc i);

#endif /* _nodave */

#ifdef __cplusplus
 }
#endif


/*
变化：
     2005年4月10日第一个版本。
	 05/9/11添加了对长数据块的读/写功能。
	10/26/07固定__cplusplus
	 版本0.8.5：
	13年5月17日添加了winsock2，以实现46位兼容性。
	 2013年5月17日将conType字段添加到daveOSserialType
*/
